// 导入 axios
import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Message } from 'element-ui'
import { getTImeStamp } from './auth'

// 定义一个 token 过期的时间（默认 30 分钟）
const exporess_time = 30 * 60 * 1000
// const exporess_time = 5 * 1000

// 创建 axios 副本
const instance = axios.create({
  baseURL: process.env.VUE_APP_BASEURL
})
// 设置拦截器
// 请求拦截器
instance.interceptors.request.use(
  config => {
    // 判断 token 是否过期
    // 得到当前时间
    const currentTime = Date.now()
    // 得到 token 的保存时间
    const token_time = getTImeStamp()
    // 得到两者的时间间隔
    const space = currentTime - token_time
    // 判断间隔是否大于 exporess_time
    if (space > exporess_time) {
      // 已经过期了
      // 清除 token，跳转到登录页面，中断后续请求
      store.dispatch('user/logout')
      Message({
        type: 'info',
        message: '登录超时，请重新登录'
      })
      router.push(`/login?_redirect=${window.location.href.split('#')[1]}`)
      return Promise.reject(new Error('登录超时，请重新登录'))
    }
    // 统一注入 token
    // 得到 token
    const token = store.getters.token
    if (token) {
      // 将 token 添加到请求头中
      config.headers.Authorization = `Bearer ${token}`
    }
    // 成功回调
    return config
  },
  error => {
    // 失败的回调
    return Promise.reject(error)
  }
)
// 响应拦截器
instance.interceptors.response.use(
  // 成功时的回调：服务器响应的状态是 2xx 时触发
  response => {
    // 接收返回信息
    // 解构 response
    const { success, message } = response.data
    // 判断 sucess
    if (success) {
      // 成功回调
      return response.data
    } else {
      // 提示错误
      Message({
        message: message,
        type: 'error'
      })
      // 失败
      return Promise.reject(new Error(message))
    }
  },
  // 错误时的回调：服务器响应的状态是 4xx 时触发
  error => {
    // 接收返回的错误信息中的 code, 并且判断code === 10002
    const bool =
      error.response &&
      error.response.data &&
      error.response.data.code === 10002
    if (bool) {
      Message({
        type: 'info',
        message: '登录过期，请重新登录'
      })
      // 如果等于说明 token 失效，需要清除 token 重新登录
      store.dispatch('user/logout')
      // 跳转到登录页面
      // 先将当前访问的页面路径记录下，
      const url = window.location.href.split('#')[1]
      // 保存到 login 的路径中
      router.push(`/login?_redirect=${url}`)
    }
    return Promise.reject(error)
  }
)
// 暴露 instance
export default instance
